package models

import (
	"time"

	"gorm.io/gorm"
)

// ProjectStatus 课题状态
type ProjectStatus string

const (
	ProjectStatusOpen       ProjectStatus = "open"        // 开放
	ProjectStatusClosed     ProjectStatus = "closed"      // 已关闭
	ProjectStatusInProgress ProjectStatus = "in_progress" // 进行中
	ProjectStatusCompleted  ProjectStatus = "completed"   // 已完成
)

// ApplicationStatus 申请状态
type ApplicationStatus string

const (
	ApplicationStatusPending   ApplicationStatus = "pending"   // 待审核
	ApplicationStatusAccepted  ApplicationStatus = "accepted"  // 已通过
	ApplicationStatusRejected  ApplicationStatus = "rejected"  // 已拒绝
	ApplicationStatusWithdrawn ApplicationStatus = "withdrawn" // 已撤回
)

// Project 课题模型
type Project struct {
	ID        uint           `gorm:"primarykey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	// 基础信息
	Title        string        `gorm:"size:200;not null;index" json:"title"`       // 课题标题
	Description  string        `gorm:"type:text;not null" json:"description"`      // 课题描述
	Requirements string        `gorm:"type:text" json:"requirements"`              // 需求描述
	Budget       float64       `gorm:"type:decimal(10,2);index" json:"budget"`     // 预算
	Deadline     time.Time     `gorm:"index" json:"deadline"`                      // 截止日期
	Category     string        `gorm:"size:100;index" json:"category"`             // 课题分类
	Tags         string        `gorm:"size:500" json:"tags"`                       // 课题标签
	Status       ProjectStatus `gorm:"size:20;default:'open';index" json:"status"` // 状态

	// 新增字段（路由中需要）
	ContactInfo       string     `gorm:"type:text" json:"contact_info"`       // 联系方式
	IsPublic          bool       `gorm:"default:true;index" json:"is_public"` // 是否公开
	ViewCount         int        `gorm:"default:0;index" json:"view_count"`   // 浏览次数
	ApplyCount        int        `gorm:"default:0;index" json:"apply_count"`  // 申请次数
	Priority          int        `gorm:"default:1;index" json:"priority"`     // 优先级
	Location          string     `gorm:"size:100" json:"location"`            // 地点
	Skills            string     `gorm:"type:text" json:"skills"`             // 所需技能
	Duration          int        `gorm:"default:0" json:"duration"`           // 项目时长（天）
	MaxApplicants     int        `gorm:"default:0" json:"max_applicants"`     // 最大申请人数
	CurrentApplicants int        `gorm:"default:0" json:"current_applicants"` // 当前申请人数
	StartDate         *time.Time `json:"start_date"`                          // 开始日期
	EndDate           *time.Time `json:"end_date"`                            // 结束日期

	// 关联
	CreatorID    uint          `gorm:"not null;index" json:"creator_id"` // 创建者ID
	Creator      User          `gorm:"foreignKey:CreatorID" json:"creator,omitempty"`
	Applications []Application `gorm:"foreignKey:ProjectID" json:"applications,omitempty"`
	MatchedUsers []User        `gorm:"many2many:project_matches;" json:"matched_users,omitempty"`
}

// Application 申请模型
type Application struct {
	ID        uint           `gorm:"primarykey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	// 基础信息
	ProjectID   uint              `gorm:"not null;index" json:"project_id"`              // 课题ID
	ApplicantID uint              `gorm:"not null;index" json:"applicant_id"`            // 申请人ID
	Status      ApplicationStatus `gorm:"size:20;default:'pending';index" json:"status"` // 状态
	CoverLetter string            `gorm:"type:text;not null" json:"cover_letter"`        // 申请信
	Resume      string            `gorm:"size:500" json:"resume"`                        // 简历链接

	// 新增字段（路由中需要）
	ReviewerID    *uint      `gorm:"index" json:"reviewer_id"`               // 审核人ID
	ReviewComment string     `gorm:"type:text" json:"review_comment"`        // 审核意见
	ReviewDate    *time.Time `json:"review_date"`                            // 审核时间
	ApplyDate     time.Time  `gorm:"autoCreateTime;index" json:"apply_date"` // 申请时间

	// 关联
	Project   Project `gorm:"foreignKey:ProjectID" json:"project,omitempty"`
	Applicant User    `gorm:"foreignKey:ApplicantID" json:"applicant,omitempty"`
	Reviewer  *User   `gorm:"foreignKey:ReviewerID" json:"reviewer,omitempty"`
}

// ProjectFavorite 课题收藏模型
type ProjectFavorite struct {
	ID        uint           `gorm:"primarykey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	UserID    uint `gorm:"not null;index" json:"user_id"`    // 用户ID
	ProjectID uint `gorm:"not null;index" json:"project_id"` // 课题ID

	// 新增字段
	FavoriteAt time.Time `gorm:"autoCreateTime;index" json:"favorite_at"` // 收藏时间
	Note       string    `gorm:"size:200" json:"note"`                    // 收藏备注

	// 关联
	User    User    `gorm:"foreignKey:UserID" json:"user,omitempty"`
	Project Project `gorm:"foreignKey:ProjectID" json:"project,omitempty"`
}

// ProjectMatch 课题匹配记录
type ProjectMatch struct {
	gorm.Model

	ProjectID   uint       `gorm:"not null;index" json:"project_id"`           // 课题ID
	UserID      uint       `gorm:"not null;index" json:"user_id"`              // 用户ID
	MatchedAt   time.Time  `gorm:"index" json:"matched_at"`                    // 匹配时间
	ConfirmedAt *time.Time `json:"confirmed_at"`                               // 确认时间
	IsConfirmed bool       `gorm:"default:false;index" json:"is_confirmed"`    // 是否已确认
	MatchScore  float64    `gorm:"type:decimal(5,2);index" json:"match_score"` // 匹配分数

	// 关联
	Project Project `gorm:"foreignKey:ProjectID" json:"project,omitempty"`
	User    User    `gorm:"foreignKey:UserID" json:"user,omitempty"`
}

// Notification 通知模型
type Notification struct {
	gorm.Model

	UserID      uint       `gorm:"not null;index" json:"user_id"`      // 接收用户ID
	Title       string     `gorm:"size:200;not null" json:"title"`     // 通知标题
	Content     string     `gorm:"type:text;not null" json:"content"`  // 通知内容
	Type        string     `gorm:"size:50;not null;index" json:"type"` // 通知类型
	IsRead      bool       `gorm:"default:false;index" json:"is_read"` // 是否已读
	ReadAt      *time.Time `json:"read_at"`                            // 阅读时间
	RelatedID   *uint      `gorm:"index" json:"related_id"`            // 关联ID
	RelatedType string     `gorm:"size:50;index" json:"related_type"`  // 关联类型

	// 关联
	User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
}

// TableName 指定表名
func (Project) TableName() string {
	return "projects"
}

func (Application) TableName() string {
	return "applications"
}

func (ProjectFavorite) TableName() string {
	return "project_favorites"
}

func (ProjectMatch) TableName() string {
	return "project_matches"
}

func (Notification) TableName() string {
	return "notifications"
}
